package com.hucsmn.landlord;

import java.util.*;

/**
 * 作业题五：
 * 使用集合实现斗地主游戏的部分功能，要求如下：
 * （1）首先准备 54 张扑克牌并打乱顺序。
 * （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
 * （3）查看三个玩家手中的扑克牌和底牌。
 * （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：
 * 手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
 */
public class Game {
    // 三名玩家。
    private final Player playerA = new Player("A");
    private final Player playerB = new Player("B");
    private final Player playerC = new Player("C");

    public static void main(String[] args) {
        Game game = new Game();
        game.deal();
        System.out.println(game.playerA);
        System.out.println(game.playerB);
        System.out.println(game.playerC);
    }

    /**
     * 将一套 54 张扑克牌发到三个玩家手中，每个玩家一张底牌。
     */
    public void deal() {
        List<Poker> suit = getSuit();
        assert suit.size() % 3 == 0;
        Collections.shuffle(suit);

        playerA.clear();
        playerB.clear();
        playerC.clear();
        int i;
        for (i = suit.size(); i > 3; i -= 3) {
            playerA.add(suit.remove(i - 1));
            playerB.add(suit.remove(i - 2));
            playerC.add(suit.remove(i - 3));
        }
        playerA.addLast(suit.remove(i - 1));
        playerB.addLast(suit.remove(i - 2));
        playerC.addLast(suit.remove(i - 3));
    }

    /**
     * 取得按照顺序排列的一套扑克牌，共 54 张。
     *
     * @return 全部 54 张扑克牌。
     */
    public static List<Poker> getSuit() {
        Poker.Rank[] ranks = Poker.Rank.values();
        List<Poker> suit = new ArrayList<>(54);
        for (Poker.Rank rank : ranks) {
            if (rank.hasFourColors()) {
                for (Poker.Color color : Poker.Color.colors()) {
                    suit.add(new Poker(rank, color));
                }
            } else {
                suit.add(new Poker(rank, Poker.Color.NONE));
            }
        }
        return suit;
    }
}
